package com.epfresh.api.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @author wangzhanghuan
 * @version 1.0
 * @date create 17-2-14
 * @Description
 */

public class FormatUtil {

    public static String formatDecimal(String s1) {
        DecimalFormat df = new DecimalFormat("#0.00");
        return df.format(getDouble(s1));
    }
    public static String formatDecimal(double d1) {
        DecimalFormat df = new DecimalFormat("#0.00");
        return df.format(d1);
    }
    /**
     * 使用正则表达式去掉多余的.与0，最多保留两位
     *
     * @param s
     * @return
     */
    public static String subZeroAndDot(String s) {
        if (s==null){
            return "0";
        }
        int index = s.indexOf(".");
        if (index > 0) {
            int i = s.length() - 1;
            if (i > index + 2) {
                i = index + 2;
            }
            s = s.substring(0, i + 1);
            s = s.replaceAll("0+?$", "");//去掉多余的0
            s = s.replaceAll("[.]$", "");//如最后一位是.则去掉
        }
        return s;
    }

    public static String sub2Dot(String s) {
        if (s == null || "".equals(s)){
            return "";
        }
        int index = s.indexOf(".");
        if (index > 0) {
            int i = s.length() - 1;
            if (i < index + 1) {
                s = s+"00";
            }else if (i < index+2){
                s = s+"0";
            }

        }else {
            s = s+".00";
        }
        return s;
    }
    public static String sub2Dot(double s) {

        return sub2Dot(s+"");
    }
    public static String subZeroAndDot(double d) {

        return subZeroAndDot(d+"");
    }
    public static String subZeroAndDot(String s,int point) {
        int index = s.indexOf(".");
        if (index > 0) {
            int i = s.length() - 1;
            if (i > index + point) {
                i = index + point;
            }
            s = s.substring(0, i + 1);
            s = s.replaceAll("0+?$", "");//去掉多余的0
            s = s.replaceAll("[.]$", "");//如最后一位是.则去掉
        }
        return s;
    }

    /*
     * 判断购物车数量是否需要校准
     * @param d1,购物车输入的数量
     * @param divisor,购物车数量最小增量
     * */
    public static boolean isRemainder(double d1, double divisor,double min) {
        System.out.println(d1);
        System.out.println(divisor);

        BigDecimal a1 = new BigDecimal(d1+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
        BigDecimal a2 = new BigDecimal(divisor+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
        BigDecimal a3 = new BigDecimal(min+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
//        long v = (long) (d1 * 100);
//        long w = (long) (divisor * 100);
        long v = a1.longValue();
        long w = a2.longValue();
        System.out.println("---d1:"+(d1*100));
        System.out.println("---d2:"+(divisor*100));
        System.out.println("---v:"+v+"--w:"+w);
        System.out.println("---v%w:"+(v % w > 0));
        if (w < 1) {
            w = 1;
        }
        if (v % w > 0) {
            return true;
        }

        if (d1 < min){
            return true;
        }
//        BigDecimal amt = new BigDecimal(d1);
//        BigDecimal[] results = amt.divideAndRemainder(BigDecimal.valueOf(divisor));
//        System.out.println(results[0]);
//        System.out.println(results[1]);
//        int i = results[1].multiply(BigDecimal.valueOf(100)).intValue();
//        if (i > 0) {
//            return true;
//        }
        return false;
    }

    public static double countFormat(double d1, double d2,double min) {
        return countFormat(d1,d2,min,999999);
    }
    /*
    * 校准添加购物车数量
    * @param d1,购物车输入的数量
    * @param d2,购物车数量最小增量
    * */
    public static double countFormat(double d1, double d2,double min,double max) {
//        BigDecimal amt = new BigDecimal(d1);
//        BigDecimal divisor = new BigDecimal(d2);
//        BigDecimal[] results = amt.divideAndRemainder(divisor);
//        System.out.println(results[0]);
//        System.out.println(results[1]);
//        System.out.println(results[0].add(BigDecimal.ONE).multiply(divisor).doubleValue());
//        System.out.println(results[0].multiply(divisor).doubleValue());
//        int i = results[1].multiply(BigDecimal.valueOf(100)).intValue();

//        long v = (long) (d1 * 100);
//        long w = (long) (d2 * 100);
        if(d1 > max)
            d1 = max;


        BigDecimal a1 = new BigDecimal(d1+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
        BigDecimal a2 = new BigDecimal(d2+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
//        long v = (long) (d1 * 100);
//        long w = (long) (divisor * 100);
        long v = a1.longValue();
        long w = a2.longValue();

        if (w < 1) {
            w = 1;
        }

        System.out.println("v:"+v+"--w:"+w);
        if (v % w > 0) {
            long l = v / w;
            System.out.println("l:"+v+"--w:"+w);
//            double v1 = new BigDecimal((l + 1) * w).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            BigDecimal vD = new BigDecimal((l + 1) * w).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
//            System.out.println("v1:"+v1);
            if (FormatUtil.remainderZero(vD.doubleValue(), max) > 0){
//                v1 = new BigDecimal(l * w).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                vD = new BigDecimal(l * w).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);

            }

            if(vD.compareTo(new BigDecimal(min).setScale(2, BigDecimal.ROUND_HALF_UP))< 0){
                return min;
            }

            return vD.doubleValue();
//            return (l + 1) * w / 100d;
//            return results[0].add(BigDecimal.ONE).multiply(divisor).doubleValue();
        }
//        if (results[1].compareTo(BigDecimal.ZERO) > 0) {
//            return results[0].add(BigDecimal.ONE).multiply(divisor).doubleValue();
//        }
//        return results[0].multiply(divisor).doubleValue();
        if(new BigDecimal(d1+"").setScale(2, BigDecimal.ROUND_HALF_UP).compareTo(new BigDecimal(min).setScale(2, BigDecimal.ROUND_HALF_UP))< 0){
            return min;
        }
        return d1;
    }

    public static double countAdd(double d1, double d2) {
        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.add(divisor).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }
    public static double countAdd(String s1, String s2) {

        return countAdd(getDouble(s1),getDouble(s2));
    }
    public static double countAdd(String s1, String s2,boolean isAdd) {

        if (isAdd) {
            return countAdd(getDouble(s1), getDouble(s2));
        }else {
            return countAdd(getDouble(s1), -getDouble(s2));

        }
    }

    public static double getDouble(String s){
        try {

            return Double.valueOf(s);
        }catch (Exception e){

            return 0;
        }
    }

    public static double countSubtract(double d1, double d2) {
        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.subtract(divisor).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }
    public static double countMultiply(double d1, double d2) {
        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.multiply(divisor).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }
    public static double countMultiply(String s1, String s2) {

        return countMultiply(getDouble(s1),getDouble(s2));
    }
    public static double countDivide(double d1, double d2) {

        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.divide(divisor,2,BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }
    public static double countDivideUp(double d1, double d2) {

        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.divide(divisor,2,BigDecimal.ROUND_UP).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }
    public static double countDivideDown(double d1, double d2) {

        BigDecimal amt = new BigDecimal(d1).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal divisor = new BigDecimal(d2).setScale(2, BigDecimal.ROUND_HALF_UP);

        BigDecimal add = amt.divide(divisor,2,BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_HALF_UP);

        return add.doubleValue();
    }

    public static long remainderZero(double d1 ,double d2){

        BigDecimal a1 = new BigDecimal(d1+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);
        BigDecimal a2 = new BigDecimal(d2+"").setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN);


        return a1.longValue() - a2.longValue();

    }
}
